Skip to content

Release v0.4.0-alpha#44

Merged
Tresillo2017 merged 108 commits intomasterfrom
staging
Apr 14, 2026
Merged

Release v0.4.0-alpha#44
Tresillo2017 merged 108 commits intomasterfrom
staging

Conversation

@Tresillo2017
Copy link
Copy Markdown
Owner

Summary

Major feature release bringing profile system, badge achievements, and comprehensive build fixes.

What's New

New Features

  • Profile System with listening stats, heatmaps, and weekday pattern analysis
  • Badge System with 20 achievements - earn badges by listening, discovering, and participating
  • Activity Feed showing your listening milestones, badges earned, and playlist updates
  • Wrapped Feature generates annual and monthly analytics with shareable images
  • Skeleton Loaders throughout the app provide better loading states
  • Artist Profile Images now stored on R2 with automatic multi-size generation (40px, 80px, 200px)
  • Session Tracking automatically saves your listening history and position

Improvements

  • Redesigned What's New popout to match app design system with proper card styling
  • What's New popout now opens from profile dropdown (removed dedicated changelog page)
  • All popouts can be dismissed by clicking outside the content area
  • GitHub Actions automatically check TypeScript, run tests, and scan for security issues
  • Admin panel can auto-upload artist images from 1001Tracklists

Bug Fixes

  • ✅ Resolved all 66 TypeScript errors across the entire codebase
  • ✅ Fixed album color extraction (node-vibrant v4 compatibility)
  • ✅ Fixed Cloudflare Workers environment type conflicts
  • ✅ Profile stats API correctly validates Better Auth user IDs
  • ✅ Avatar URLs persist properly in Better Auth sessions
  • ✅ Toast notifications are now readable on dark backgrounds
  • ✅ Stats endpoint uses proper DB-querying functions

Testing

  • Build passes without TypeScript errors
  • All features tested locally
  • GitHub Actions workflows configured and passing

🤖 Generated with Claude Code

Tresillo2017 and others added 30 commits April 8, 2026 17:23
   Comprehensive design document for Sileo toast integration:
   - HSL-parametric styling with solid card treatment
   - Context-based timing (3s quick actions, 7s errors, 8s notifications)
   - Top-center positioning with max 3 visible toasts
   - Theme-aware colors across all variants
   - Accessibility compliance (WCAG AA, reduced motion, screen readers)
   - Usage examples for all interaction types (user actions, admin ops, errors, notifications)
   - Edge case handling and future enhancement roadmap
   Install Sileo ^0.1.5 for toast notifications across user actions,
   admin operations, errors, and future watch party features.
Sileo style overrides matching HSL-parametric design system:
- Solid card treatment (hsl(var(--b5)) background, inset shadow border)
- Variant colors (success=accent, error=danger, warning=warning, info=muted)
- Typography (Geist, weight 480/650, size 13px/14px)
- Theme-aware via HSL variables (auto-adapts to dark/light/oled/darker)
- Responsive (90vw mobile, 450px desktop max-width)
- z-index 45 (between player 40 and modals 50)
- Reduced motion support

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add toast.css import after Tailwind to apply Sileo overrides globally.
Import order ensures toast styles load before custom utilities.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add Sileo Toaster component to App.tsx with:
- Position: top-center (centralized, consistent expectations)
- Global availability (inside ErrorBoundary, after Routes)

Toasts now available via sileo.success/error/warning/info/action/promise
throughout the application.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Comprehensive example functions demonstrating context-aware timing:
- Quick actions (3s): like, copy, add to playlist
- Admin operations (4s): ban user, upload set, create invite
- Errors (7s): validation, network, save failures
- Notifications (8s): new sets, comments, watch party events
- Critical (manual): session expired, maintenance warnings
- Interactive: undo delete, view comment with action buttons
- Promise-based: upload/save progress with loading states

All examples follow spec timing guidelines and include descriptions
where appropriate for enhanced context.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Integrate Sileo toasts with LikeButton for user feedback:
- Success: 'Liked!' on like action (3s quick feedback)
- Success: 'Removed from liked songs' on unlike (3s)
- Error: 'Failed to update like status' on API error (7s)

Optimistic UI update with rollback on error, toast provides
confirmation without disrupting playback or browsing flow.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The Toaster component in App.tsx now respects the user's theme preference from settings.
Maps Zephyron theme names to Sileo's theme values:
- dark/darker/oled → 'dark' theme
- light → 'light' theme

Toasts now update immediately when switching themes in Settings without requiring a page refresh.
Toasts were appearing in light mode regardless of selected theme (OLED, darker, etc.) because Sileo uses SVG rect elements with fill attributes that CSS background properties cannot override.

Solution: compute fill color dynamically from CSS --b5 variable using getComputedStyle and pass to Sileo's options.fill prop. This ensures toasts match the current theme (OLED=true black, darker=6% lightness, dark=14%, light=94%).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add bio TEXT column (max 160 chars in app logic)
- Add avatar_url TEXT for R2 avatar URLs
- Add is_profile_public INTEGER for privacy controls (default private)
- Add index for efficient public profile queries

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Update User interface: add avatar_url, bio, is_profile_public
- Add PublicUser interface for public profile views
- Add API request/response types for profile endpoints
- Mark reputation fields as deprecated (to be removed in Phase 3)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add AVATARS R2 bucket binding (zephyron-avatars)
- Bucket will store user profile pictures as WebP files
- Naming convention: {userId}-{timestamp}.webp

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- POST /api/profile/avatar/upload
- Validates file type (image/*) and size (max 10MB)
- Uploads to R2 AVATARS bucket as WebP
- Saves avatar_url to user table
- Returns new avatar URL on success
- Includes error handling for all validation failures

Phase 1 note: Server-side image resizing deferred to Phase 2
Client handles preview/crop for now

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove errorResponse from profile.ts imports (unused, breaks build)
- Remove avatar_url from migration 0019 (already exists in 0001)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- PATCH /api/profile/settings
- Supports updating name, bio, is_profile_public
- Validates display name: 3-50 chars, alphanumeric + spaces + punctuation
- Validates bio: max 160 chars, strips HTML
- Checks display name uniqueness (case-insensitive)
- Returns updated user object on success

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Use Better Auth API for name updates (maintains session consistency)
- Add input trimming for display name field
- Replace typed errors with errorResponse() helper (project convention)
- Convert is_profile_public from INTEGER to boolean in response
- Use 409 status code for name conflicts (not 400)

Addresses code quality review feedback for Task 5.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- GET /api/profile/:userId
- Returns public profile data when is_profile_public = 1
- Returns PROFILE_PRIVATE error when private
- Excludes email for privacy
- Full implementation (stats, activity) coming in Phase 3

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add nanoid format validation for user IDs
- Use explicit integer comparison for is_profile_public check
- Document index utilization for future maintainers

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- uploadAvatar: uploads profile picture to backend
- updateProfileSettings: updates display name, bio, privacy
- getPublicProfile: fetches public profile data
- All functions include error handling and type safety

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Backend expects 'file' field, not 'avatar'. This fix ensures
avatar uploads work correctly with the backend endpoint.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Frontend type now matches backend contract. The role field is
returned by GET /api/profile/:userId and should be accessible
in components.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Modal dialog with drag-drop and file browser
- Live preview of selected image
- File validation: type (image/*) and size (max 10MB)
- Upload progress indicator
- Toast notifications for success/error
- Closes modal and triggers callback on success

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add Escape key handling to close modal
- Add body scroll lock while modal is open
- Add ARIA attributes (role, aria-modal, aria-labelledby)
- Make drop zone keyboard accessible (tab + Enter/Space)
- Fix progress interval cleanup on component unmount
- Fix drag state flickering on child hover
- All changes improve WCAG 2.1 AA compliance

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Inline text input with character counter (160 max)
- Auto-save on blur (debounced, silent)
- Counter turns red when over limit
- Reverts to previous value on error
- Shows saving indicator during update

Also fixes:
- ProfilePictureUpload: correct sileo import and interval type
- worker/routes/profile: remove unused UpdateProfileSettingsError import

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Displays avatar (image or fallback initial)
- Shows display name, bio (truncated), role badge
- Avatar is clickable when viewing own profile
- Edit Profile button (only on own profile)
- Responsive sizing (80px mobile, 96px desktop)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove tier calculation logic
- Remove tier badge and reputation points from header
- Replace stats: show Playlists, Liked Songs, Sets Listened
- Remove reputation guide card (earning rules, progress bar)
- Clean profile focused on listening activity

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Replace header card with ProfileHeader component
- Add TabBar with 4 tabs: Overview, Activity, Playlists, About
- Overview: stats grid + recent activity placeholder
- Activity: placeholder for Phase 3
- Playlists: placeholder with count
- About: role and joined date
- Avatar upload modal integration
- Remove sidebar (migrated to Settings)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Profile picture: avatar preview + change button + upload modal
- Display name: inline editor with validation
- Bio: inline editor with character counter + auto-save
- Privacy: toggle for public profile visibility
- All sections integrated with profile components
- Optimistic UI with error rollback

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Triggers on push to master branch
- Reads version from package.json
- Extracts changelog section from CHANGELOG.md
- Creates Git tag (v{version})
- Creates GitHub Release with changelog content
- Marks as pre-release for alpha/beta/rc versions
- Skips if release already exists

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Creates releases for all versions in CHANGELOG.md that don't have
GitHub releases yet. Finds commits by version tag in commit message,
extracts changelog content, creates tags and releases.

Features:
- Dry-run mode to preview changes
- Skips existing tags/releases
- Auto-detects pre-release versions (alpha/beta/rc)
- Uses gh CLI for release creation

Usage:
  ./scripts/backfill-releases.sh --dry-run  # Preview
  ./scripts/backfill-releases.sh            # Execute

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Tresillo2017 and others added 20 commits April 12, 2026 16:24
- Update getStats to call calculateHeatmap and calculateWeekdayPattern with DB params
- Remove redundant listening history queries (functions handle DB queries internally)
- Maintain backward compatibility with existing tests

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Better Auth generates 32-character IDs, not 12-character nanoids.
Updated validation from {12} to {8,64} in all profile endpoints.

Fixes INVALID_USER_ID error on stats, badges, activity endpoints.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added getOptionalAuth helper for optional authentication.
Updated stats, badges, and activity endpoints to allow access when:
- Profile is public (existing behavior), OR
- Authenticated user is viewing their own profile (new)

Fixes 403 PROFILE_PRIVATE error when users view their own stats/badges.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Only show "Your 2026 Wrapped" card in December or later to avoid
showing year-end stats when the year is still in progress

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add skeleton loading states for all data-fetching components:
- ProfileStatsSkeleton for stats grid, top artists, and heatmap
- BadgesGridSkeleton for achievement badges display
- ActivityFeedSkeleton for activity feed items
- PlaylistGridSkeleton for playlist cards
- SearchResultSkeleton for search results with artists and sets
- ArtistBannerSkeleton for artist page headers
- SetBannerSkeleton for set page headers
- HistoryListSkeleton for listening history
- ArtistGridSkeleton for artist grids
- EventGridSkeleton for event listings

Updated components and pages to use new skeletons instead of
generic loading text:
- ProfileStatsSection, BadgesGrid, ActivityFeed
- ArtistPage, SetPage, SearchPage, PlaylistsPage, HistoryPage

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Migrate artist profile images from external API fetches to Cloudflare R2
bucket storage with new dedicated endpoint.

Backend:
- Add GET /api/artists/:id/image endpoint to serve images from R2
- Images stored at R2 key: artists/{id}/image.jpg
- Cache headers: 86400s max-age, public, CORS enabled
- Fallback to 404 if artist or image not found

Frontend:
- Add getArtistImageUrl() helper function
- Update ArtistPage to use R2 endpoint for banner and profile
- Update ArtistsPage to use R2 endpoint for thumbnails
- Update SetPage artist info to use R2 endpoint
- Update EventPage lineup to use R2 endpoint
- Update admin ArtistsTab display to use R2 endpoint
- Keep image_url field editable in admin for legacy URLs

All artist images now served from R2 with consistent caching and
performance characteristics. Backend image_url field retained for
backward compatibility and admin flexibility.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add professional logo and multi-size favicon assets to replace
placeholder SVG icon.

Assets:
- Logo: /logo-128.png, /logo.svg
- Favicons: 16x16, 32x32, 180x180, 192x192, 512x512
- Apple touch icon: 180x180

Updates:
- Replace SVG play-circle icon with actual logo in navigation
- Add proper favicon links in index.html
- Update Header, PlayerBar, Sidebar, TopNav components
- Update all landing/auth pages (Landing, About, Login, Register, Privacy, Terms)
- Remove placeholder vite.svg

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add comprehensive skill summaries to CLAUDE.md for better AI assistance:
- Accessibility, adapt, animate, arrange, audit skills
- Better Auth integration and security best practices
- Cloudflare platform comprehensive coverage
- Frontend design, React performance, TypeScript patterns
- Vite, Vitest, web performance
- Workers best practices and Wrangler CLI

Approach guidelines added for code style consistency.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Remove image_url field from admin artist edit modal since profile
images are now served from R2 storage. Artists should upload images
directly to R2 bucket at artists/{id}/image.jpg instead of using
external URLs.

Changes:
- Remove imageUrl state and input field
- Remove image preview section
- Remove image_url from enrichment logic
- Remove image_url from save payload
- Update enrichment description text

Images are now managed independently through R2 upload process.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add automated migration script and comprehensive guide for uploading
existing artist images from external URLs to R2 storage.

Files:
- scripts/migrate-artist-images.ts: Automated bulk migration script
  - Fetches artists with image_url from D1
  - Downloads images from external URLs
  - Uploads to R2 at artists/{id}/image.jpg
  - Supports dry-run, limit, and single-artist modes
  - Rate-limited with progress tracking

- scripts/MIGRATION_GUIDE.md: Complete migration documentation
  - Automated script usage instructions
  - Manual wrangler upload alternative
  - Admin UI upload feature implementation example
  - Environment setup and API credential guide
  - Troubleshooting section

Script requires: @aws-sdk/client-s3, Cloudflare API credentials

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Automatically fetch and upload artist profile images to R2 when
enriching from 1001Tracklists HTML in admin panel.

Backend:
- Add POST /api/admin/artists/:id/image endpoint
- Downloads image from provided URL
- Uploads to R2 at artists/{id}/image.jpg
- Returns success/error with R2 key

Frontend:
- Add uploadArtistImageAdmin() API function
- Update enrichment handler to be async
- Auto-upload image when parsing 1001TL HTML
- Show loading state during image upload
- Update success message to mention image upload
- Apply to both edit and import artist modals

Now when pasting 1001Tracklists HTML:
1. Parse all artist data (social links, bio, etc.)
2. Download profile image from 1001TL
3. Upload to R2 automatically
4. Image shows immediately on artist pages

Image upload failures are logged but don't block enrichment.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Update artist image migration script to automatically load credentials
from .env file instead of requiring manual export commands.

Changes:
- Add .env file detection and loading at script start
- Import path utilities for cross-platform .env resolution
- Better error messages showing which variables are missing
- Create .env.example template with all required variables
- Update MIGRATION_GUIDE.md with .env setup instructions

Usage is now simpler:
1. Add Cloudflare credentials to project root .env
2. Run: bun run scripts/migrate-artist-images.ts

The script validates all required variables and shows helpful error
messages if any are missing from .env.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Remove "Activity feed coming in Phase 3" placeholder and show actual
recent activity on profile overview tab.

Changes:
- Replace placeholder card with ActivityFeed component
- Show 3 most recent activity items as preview
- Add "View all →" button that switches to activity tab
- Use feed="me" to show current user's activity

The activity feature was already implemented but the placeholder was
never removed. Now users can see their recent activity directly on
the overview tab, with a link to view the full activity feed.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Enable file watching polling for WSL2 environments where native file
watching doesn't work across Windows-Linux filesystem boundary.

Changes:
- Add server.watch.usePolling: true
- Set polling interval to 300ms
- Enable HMR error overlay

This fixes hot reload not working when project is located on Windows
filesystem (/mnt/e/) and accessed from WSL2.

Alternative solution: Move project to Linux filesystem (~/projects/)
for better performance without polling overhead.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove unused React imports from components (React 17+ JSX transform)
- Add Env interface with all required Cloudflare bindings
- Fix property name mismatches: cover_art_r2_key → cover_image_r2_key
- Add artist_id to Discord API query results
- Fix ctx → _ctx and artistId references in admin-beta.ts
- Add RESIZE_FAILED to UploadAvatarError union type
- Prefix unused parameters with underscore

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add comprehensive CI/CD workflows for production:

**Type Checking**
- Runs on all main branches (master, staging, develop)
- Checks both frontend and worker TypeScript

**Testing**
- Runs tests on push and PR
- Uploads coverage to Codecov

**Security**
- CodeQL: Weekly security scans + analysis on push/PR
- Dependency Review: Blocks PRs with high-severity vulns

**Deployment**
- Cloudflare Pages preview deployments for PRs
- Automatic preview URL comments on PRs

These workflows ensure:
✓ Type safety across all branches
✓ Test coverage tracking
✓ Security vulnerability detection
✓ Safe dependency updates
✓ Easy preview deployments

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Cloudflare Pages already handles automatic deployments via
GitHub integration. The deploy-preview.yml workflow is
unnecessary and would duplicate existing functionality.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
**Frontend Fixes:**
- Create ExtendedUser type for Better Auth avatar_url field
- Fix ProfilePage and SettingsPage avatar_url access
- Prefix unused variables: \_navigate, \_currentSessionId

**Worker Fixes:**
- Add @types/node for Buffer type
- Add Env type imports to cron and lib files
- Fix R2 put options: contentType → httpMetadata.contentType
- Prefix unused imports: \_Image, \_vi
- Fix stats.ts return types with explicit generics
- Prefix all unused test parameters with underscore
- Fix wrapped.test.ts month type and r2_key access
- Add missing Env properties: BETTER_AUTH_URL, BETTER_AUTH_SECRET,
  INVIDIOUS_BASE_URL, YOUTUBE_API_KEY

**Remaining Issues (32 errors):**
- Env type conflicts between wrangler-generated and worker/types.ts
- node-vibrant default export issue
- Route handler type mismatches in worker/index.ts

These require deeper wrangler configuration investigation.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
New Features:
- Profile system with listening stats, heatmaps, and weekday patterns
- Badge system with 20 achievements for listening milestones
- Activity feed showing badges earned and listening history
- Wrapped feature with annual and monthly analytics
- Skeleton loaders throughout the app
- Artist profile images stored on R2 with multi-size generation
- Session tracking for listening history

Improvements:
- Redesigned What's New popout to match app design system
- What's New popout now opens from profile dropdown (removed dedicated page)
- All popouts can be dismissed by clicking outside
- GitHub Actions for automated TypeScript checks, tests, and security scans
- Avatar images generated in multiple sizes for better performance

Fixes:
- Resolved all 66 TypeScript errors across the codebase
- Fixed album color extraction (node-vibrant v4 compatibility)
- Fixed Cloudflare Workers environment type conflicts
- Profile stats API now validates Better Auth user IDs correctly
- Avatar URLs persist properly in Better Auth sessions
- Toast notifications are readable on dark backgrounds

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 14, 2026 19:06
@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages bot commented Apr 14, 2026

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
zephyron 3f34c1b Apr 14 2026, 07:09 PM

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 14, 2026

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 5 package(s) with unknown licenses.
See the Details below.

Snapshot Warnings

⚠️: No snapshots were found for the head SHA 3f34c1b.
Ensure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice.

License Issues

.github/workflows/typecheck.yml

PackageVersionLicenseIssue Type
actions/checkout6.*.*NullUnknown License
oven-sh/setup-bun2.*.*NullUnknown License

package.json

PackageVersionLicenseIssue Type
@aws-sdk/client-s3^3.1030.0NullUnknown License
@napi-rs/canvas^0.1.97NullUnknown License
sileo^0.1.5NullUnknown License

OpenSSF Scorecard

PackageVersionScoreDetails
actions/actions/checkout 6.*.* 🟢 5.7
Details
CheckScoreReason
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Code-Review🟢 10all changesets reviewed
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
Packaging⚠️ -1packaging workflow not detected
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 3dependency not pinned by hash detected -- score normalized to 3
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 5branch protection is not maximal on development and all release branches
SAST🟢 8SAST tool detected but not run on all commits
actions/oven-sh/setup-bun 2.*.* UnknownUnknown
npm/@aws-sdk/client-s3 ^3.1030.0 UnknownUnknown
npm/@napi-rs/canvas ^0.1.97 UnknownUnknown
npm/sileo ^0.1.5 UnknownUnknown
npm/vitest ^4.1.4 UnknownUnknown

Scanned Files

  • .github/workflows/typecheck.yml
  • package-lock.json
  • package.json

Comment thread .github/workflows/test.yml Fixed
Comment thread .github/workflows/typecheck.yml Fixed
Comment thread worker/routes/profile.ts Fixed
Tresillo2017 and others added 3 commits April 14, 2026 21:07
…ntain permissions'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Signed-off-by: Tomás Palma <tomas@tomasps.com>
…ntain permissions'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Signed-off-by: Tomás Palma <tomas@tomasps.com>
…racter sanitization'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Signed-off-by: Tomás Palma <tomas@tomasps.com>
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR adds a large set of Cloudflare “deploy skill” reference documents under .agents/skills/cloudflare-deploy/, plus an agent interface definition, to guide deployments and platform feature usage (observability, storage, security, AI, etc.).

Changes:

  • Added new reference documentation for many Cloudflare products (API, bindings, storage, observability, security, AI, etc.).
  • Added a skill “entrypoint” agent definition (openai.yaml) for the Cloudflare deploy skill.
  • Introduced multiple runnable code examples (TypeScript/JS/YAML/TOML/SQL/GraphQL) across the new docs.

Reviewed changes

Copilot reviewed 136 out of 610 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
.agents/skills/cloudflare-deploy/references/observability/api.md Adds API/query examples for Workers observability (GraphQL, SQL, logs, types).
.agents/skills/cloudflare-deploy/references/observability/README.md Adds overview + navigation for observability reference docs.
.agents/skills/cloudflare-deploy/references/network-interconnect/patterns.md Adds CNI architecture/pattern examples and decision matrix.
.agents/skills/cloudflare-deploy/references/network-interconnect/configuration.md Adds CNI setup workflow, BGP and monitoring guidance.
.agents/skills/cloudflare-deploy/references/network-interconnect/README.md Adds CNI overview, use cases, automation boundaries.
.agents/skills/cloudflare-deploy/references/miniflare/gotchas.md Adds Miniflare limitations/troubleshooting guidance.
.agents/skills/cloudflare-deploy/references/miniflare/configuration.md Adds Miniflare configuration examples (bindings, storage, workers).
.agents/skills/cloudflare-deploy/references/miniflare/README.md Adds Miniflare overview and decision tree for testing approaches.
.agents/skills/cloudflare-deploy/references/kv/gotchas.md Adds KV pitfalls, limits, and troubleshooting examples.
.agents/skills/cloudflare-deploy/references/kv/configuration.md Adds KV setup examples (wrangler config, types, CLI, SDK).
.agents/skills/cloudflare-deploy/references/kv/README.md Adds KV overview, API surface summary, and reading order.
.agents/skills/cloudflare-deploy/references/images/patterns.md Adds Cloudflare Images usage patterns (uploads, transforms, caching).
.agents/skills/cloudflare-deploy/references/images/gotchas.md Adds Images limits/errors and best practices.
.agents/skills/cloudflare-deploy/references/images/api.md Adds Images binding + REST + URL transform API reference.
.agents/skills/cloudflare-deploy/references/images/README.md Adds Images navigation/reading order, links to anchors in other docs.
.agents/skills/cloudflare-deploy/references/hyperdrive/gotchas.md Adds Hyperdrive troubleshooting and limits.
.agents/skills/cloudflare-deploy/references/hyperdrive/api.md Adds Hyperdrive binding + driver examples and caching guidance.
.agents/skills/cloudflare-deploy/references/hyperdrive/README.md Adds Hyperdrive overview and quick start.
.agents/skills/cloudflare-deploy/references/email-workers/patterns.md Adds inbound email processing patterns (parsing, routing, storage).
.agents/skills/cloudflare-deploy/references/email-workers/gotchas.md Adds Email Workers pitfalls (streams, waitUntil), security, limits.
.agents/skills/cloudflare-deploy/references/email-workers/configuration.md Adds Email Workers wrangler config + deps + local dev guidance.
.agents/skills/cloudflare-deploy/references/email-workers/README.md Adds Email Workers overview and reading order with cross-links.
.agents/skills/cloudflare-deploy/references/email-routing/configuration.md Adds Email Routing wrangler setup and deployment examples.
.agents/skills/cloudflare-deploy/references/email-routing/README.md Adds Email Routing overview and quickstart handler example.
.agents/skills/cloudflare-deploy/references/durable-objects/configuration.md Adds DO binding/migrations/jurisdiction configuration guidance.
.agents/skills/cloudflare-deploy/references/do-storage/gotchas.md Adds DO storage concurrency model + SQLite limitations/gotchas.
.agents/skills/cloudflare-deploy/references/do-storage/configuration.md Adds DO storage migrations + example DO class + RPC notes.
.agents/skills/cloudflare-deploy/references/do-storage/api.md Adds DO storage SQL/KV APIs, transactions, alarms, PITR reference.
.agents/skills/cloudflare-deploy/references/do-storage/README.md Adds DO storage overview and reading order.
.agents/skills/cloudflare-deploy/references/ddos/gotchas.md Adds DDoS tuning and common errors guidance.
.agents/skills/cloudflare-deploy/references/ddos/configuration.md Adds DDoS override structure and plan availability notes.
.agents/skills/cloudflare-deploy/references/ddos/README.md Adds DDoS overview and reading order.
.agents/skills/cloudflare-deploy/references/d1/gotchas.md Adds D1 pitfalls/limits guidance.
.agents/skills/cloudflare-deploy/references/d1/README.md Adds D1 overview, core methods, limits, and operational guidance.
.agents/skills/cloudflare-deploy/references/cron-triggers/README.md Adds cron trigger overview + examples.
.agents/skills/cloudflare-deploy/references/containers/gotchas.md Adds Containers gotchas and lifecycle guidance.
.agents/skills/cloudflare-deploy/references/containers/README.md Adds Containers overview and routing decision tree.
.agents/skills/cloudflare-deploy/references/cache-reserve/configuration.md Adds Cache Reserve enablement and IaC examples.
.agents/skills/cloudflare-deploy/references/c3/patterns.md Adds create-cloudflare workflows and CI patterns.
.agents/skills/cloudflare-deploy/references/c3/gotchas.md Adds create-cloudflare troubleshooting guidance.
.agents/skills/cloudflare-deploy/references/c3/configuration.md Adds guidance on generated output and placeholder bindings.
.agents/skills/cloudflare-deploy/references/c3/api.md Adds create-cloudflare CLI flag reference.
.agents/skills/cloudflare-deploy/references/c3/README.md Adds create-cloudflare overview and decision tree.
.agents/skills/cloudflare-deploy/references/browser-rendering/patterns.md Adds Browser Rendering (Puppeteer/Playwright) usage patterns.
.agents/skills/cloudflare-deploy/references/browser-rendering/gotchas.md Adds Browser Rendering limits and common errors.
.agents/skills/cloudflare-deploy/references/browser-rendering/configuration.md Adds Browser Rendering setup + wrangler config.
.agents/skills/cloudflare-deploy/references/browser-rendering/api.md Adds Browser Rendering REST + binding API examples.
.agents/skills/cloudflare-deploy/references/browser-rendering/README.md Adds Browser Rendering overview + navigation.
.agents/skills/cloudflare-deploy/references/bot-management/README.md Adds Bot Management overview and basic patterns.
.agents/skills/cloudflare-deploy/references/bindings/README.md Adds binding catalog and selection guide.
.agents/skills/cloudflare-deploy/references/argo-smart-routing/patterns.md Adds Argo enablement patterns + validation/verification examples.
.agents/skills/cloudflare-deploy/references/argo-smart-routing/gotchas.md Adds Argo best practices and common errors.
.agents/skills/cloudflare-deploy/references/argo-smart-routing/README.md Adds Argo overview and “should I enable?” guidance.
.agents/skills/cloudflare-deploy/references/api/configuration.md Adds Cloudflare API SDK configuration (TS/Python/Go) guidance.
.agents/skills/cloudflare-deploy/references/api/README.md Adds Cloudflare API integration overview and reading order.
.agents/skills/cloudflare-deploy/references/api-shield/gotchas.md Adds API Shield troubleshooting and limits.
.agents/skills/cloudflare-deploy/references/api-shield/api.md Adds API Shield endpoints + Workers/firewall field references.
.agents/skills/cloudflare-deploy/references/api-shield/README.md Adds API Shield overview and navigation.
.agents/skills/cloudflare-deploy/references/analytics-engine/patterns.md Adds Analytics Engine schema patterns and anti-patterns.
.agents/skills/cloudflare-deploy/references/analytics-engine/gotchas.md Adds Analytics Engine sampling/indexing gotchas.
.agents/skills/cloudflare-deploy/references/analytics-engine/configuration.md Adds Analytics Engine binding setup and limits.
.agents/skills/cloudflare-deploy/references/analytics-engine/api.md Adds Analytics Engine API and SQL query examples.
.agents/skills/cloudflare-deploy/references/analytics-engine/README.md Adds Analytics Engine overview + decision guidance.
.agents/skills/cloudflare-deploy/references/ai-search/patterns.md Adds AI Search patterns (streaming, filters, reranking).
.agents/skills/cloudflare-deploy/references/ai-search/gotchas.md Adds AI Search limitations and troubleshooting guidance.
.agents/skills/cloudflare-deploy/references/ai-search/configuration.md Adds AI Search setup and multi-env patterns.
.agents/skills/cloudflare-deploy/references/ai-search/api.md Adds AI Search binding + REST API reference.
.agents/skills/cloudflare-deploy/references/ai-search/README.md Adds AI Search overview and platform limits.
.agents/skills/cloudflare-deploy/references/ai-gateway/troubleshooting.md Adds AI Gateway troubleshooting and retry patterns.
.agents/skills/cloudflare-deploy/references/ai-gateway/sdk-integration.md Adds AI Gateway SDK integration examples.
.agents/skills/cloudflare-deploy/references/ai-gateway/features.md Adds AI Gateway feature reference (caching/DLP/logging/etc.).
.agents/skills/cloudflare-deploy/references/ai-gateway/dynamic-routing.md Adds AI Gateway dynamic routing descriptions and usage examples.
.agents/skills/cloudflare-deploy/references/ai-gateway/configuration.md Adds AI Gateway setup and required permission guidance.
.agents/skills/cloudflare-deploy/references/agents-sdk/configuration.md Adds Agents SDK wrangler setup, routing, email, optional MCP config.
.agents/skills/cloudflare-deploy/references/agents-sdk/README.md Adds Agents SDK overview and decision matrix.
.agents/skills/cloudflare-deploy/agents/openai.yaml Adds agent metadata (name, icons, default prompt).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@@ -0,0 +1,6 @@
interface:
display_name: "Cloudflare Deploy"
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR title/description describes a v0.4.0-alpha app feature release (profiles, badges, wrapped, etc.), but the diff only adds .agents/skills/cloudflare-deploy/ reference docs and an agent definition. Please update the PR title/description to reflect the actual scope of changes, or split the release notes into the PR that contains the product code changes.

Copilot uses AI. Check for mistakes.
short_description: "Deploy Workers, Pages, and platform services on Cloudflare"
icon_small: "./assets/cloudflare-small.svg"
icon_large: "./assets/cloudflare.png"
default_prompt: "Deploy this app to Cloudflare (Workers or Pages) and return URL, config, and required env vars."
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR title/description describes a v0.4.0-alpha app feature release (profiles, badges, wrapped, etc.), but the diff only adds .agents/skills/cloudflare-deploy/ reference docs and an agent definition. Please update the PR title/description to reflect the actual scope of changes, or split the release notes into the PR that contains the product code changes.

Copilot uses AI. Check for mistakes.

**Query Workers Metrics**:
```graphql
query {
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The GraphQL example uses $accountId but the query does not declare any variables (and accountTag is typically a String!). As written, this query won’t run in most GraphQL clients. Consider updating the example to declare variables (e.g., query ($accountId: String!) { ... }) and/or replacing hard-coded dates with parameters so the snippet is copy/paste runnable.

Suggested change
query {
query ($accountId: String!) {

Copilot uses AI. Check for mistakes.
## Quick Decision Tree

**Need to:**
- **Transform in Worker?** → [api.md](api.md#workers-binding-api-2026-primary-method) (Workers Binding API)
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This README links to anchors/line references that don’t exist in images/api.md (e.g., #workers-binding-api-2026-primary-method, and api.md:127 when the file is < 127 lines). This makes navigation break for readers. Please align anchors to actual headings in api.md (or add matching headings), and remove/replace the line-number style references with stable section links.

Copilot uses AI. Check for mistakes.
Comment on lines +37 to +40
| `env.IMAGES.input().transform()` | Transform in Worker | [api.md:11](api.md) |
| REST API `/images/v1` | Upload images | [api.md:57](api.md) |
| Direct Creator Upload | Client-side upload | [api.md:127](api.md) |
| URL transforms | Static image delivery | [api.md:112](api.md) |
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This README links to anchors/line references that don’t exist in images/api.md (e.g., #workers-binding-api-2026-primary-method, and api.md:127 when the file is < 127 lines). This makes navigation break for readers. Please align anchors to actual headings in api.md (or add matching headings), and remove/replace the line-number style references with stable section links.

Copilot uses AI. Check for mistakes.
| Method | Purpose | Returns |
|--------|---------|---------|
| `get(key, type?)` | Single read | `string \| null` |
| `get(keys, type?)` | Bulk read (≤100) | `Map<string, T \| null>` |
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The README documents a bulk KVNamespace.get(keys) API returning a Map, which does not match the standard Workers KV API surface (single-key get, plus list, getWithMetadata, etc.). Since this reference is meant to be copy/paste accurate, please either: (1) replace with a correct KV bulk-read strategy (e.g., parallel get() calls with Promise.all, or a different storage choice), or (2) clearly label this as pseudo-code if it’s not a real runtime API.

Copilot uses AI. Check for mistakes.
Comment on lines +53 to +54
**Cause:** Making multiple individual get() calls instead of bulk operation
**Solution:** Use bulk get with array of keys: `env.USERS.get(["user:1", "user:2", "user:3"])` to reduce to 1 operation
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This example suggests KVNamespace.get([...]) for bulk reads, which is not a standard KV runtime API pattern and is likely to mislead readers. If the intent is to recommend reducing round-trips, consider updating this section to an accurate approach (e.g., Promise.all(keys.map(k => env.USERS.get(k)))), or steer readers toward a store that supports multi-get semantics.

Suggested change
**Cause:** Making multiple individual get() calls instead of bulk operation
**Solution:** Use bulk get with array of keys: `env.USERS.get(["user:1", "user:2", "user:3"])` to reduce to 1 operation
**Cause:** Making multiple sequential `get()` calls for known keys
**Solution:** Cloudflare KV does not support bulk `get()` with an array of keys. To reduce latency, fetch keys concurrently instead: `await Promise.all(["user:1", "user:2", "user:3"].map(key => env.USERS.get(key)))`. If you need true multi-get semantics, use a store that supports them.

Copilot uses AI. Check for mistakes.

- Full-featured: KV, Durable Objects, R2, D1, WebSockets, Queues
- Fully-local: test without internet, instant reload
- TypeScript-native: detailed logging, source maps
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This README claims 'TypeScript-native', but miniflare/gotchas.md later states Miniflare doesn’t transpile TypeScript and you must build first. These statements conflict. Please reword the README to clarify what is actually TypeScript-friendly (e.g., type definitions, sourcemaps when bundling) versus what Miniflare can execute directly.

Suggested change
- TypeScript-native: detailed logging, source maps
- TypeScript-friendly: type definitions, detailed logging, source maps when bundling

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +16
// Basic email handler
export default {
async email(message, env, ctx) {
// CRITICAL: Must consume stream before response
const parser = new PostalMime.default();
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PostalMime usage (new PostalMime.default()) is inconsistent with other examples in this PR (which use import PostalMime from 'postal-mime') and is unlikely to be correct in typical ESM usage. Please update the snippet to a consistent, copy/paste-safe import + construction pattern for postal-mime (and keep it aligned across email-routing and email-workers references).

Suggested change
// Basic email handler
export default {
async email(message, env, ctx) {
// CRITICAL: Must consume stream before response
const parser = new PostalMime.default();
import PostalMime from "postal-mime";
// Basic email handler
export default {
async email(message, env, ctx) {
// CRITICAL: Must consume stream before response
const parser = new PostalMime();

Copilot uses AI. Check for mistakes.
const email = await PostalMime.parse(buffer);
```

See [gotchas.md](./gotchas.md#readablestream-can-only-be-consumed-once) for details.
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The anchor #readablestream-can-only-be-consumed-once likely doesn’t match the actual heading in email-workers/gotchas.md (which is titled 'ReadableStream Single-Use'). This will break navigation in most Markdown renderers. Update the link to the correct generated anchor (or adjust the heading to match the link).

Suggested change
See [gotchas.md](./gotchas.md#readablestream-can-only-be-consumed-once) for details.
See [gotchas.md](./gotchas.md#readablestream-single-use) for details.

Copilot uses AI. Check for mistakes.
@Tresillo2017 Tresillo2017 merged commit ea8bcf5 into master Apr 14, 2026
8 of 13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants